<?php
/*
*
*
*/

namespace hpnWse\nSpu {

use \hpnWse\stStrUtil;

/// 文件上传
class stFileUpld extends \hpnWse\stSpu
{
	/// 运行
	/// $a_Prms
	/// {
	/// c_DstDiry: String，目的目录，文件将被转移至这里
	/// c_SrcData: String$Array，Base64编码的字符串，或$_FILES的元素
	/// c_FileExtn: String，文件扩展名，默认自动推导
	/// }
	/// 返回：
	/// {
	/// c_Flnm：String，文件名（含扩展名），32个字符（MD5）＋“.[扩展名]”
	/// }
	/// 若为null则表示发生错误
	public static function cRun($a_Prms)
	{
		$l_SrcData = &$a_Prms['c_SrcData'];
		$l_IsBase64 = is_string($l_SrcData);

		if ($l_IsBase64) // Base64
		{
			// 数据形如
			// 
			//                       ↑ 解码从这里开始（逗号后）

			if (!empty($a_Prms['c_FileExtn']))
			{
				$l_Extn = $a_Prms['c_FileExtn'];
			}
			else
			{
			//	if (0 != preg_match('/\\/([^;]+);/', $l_SrcData, $l_Extn))
			//	{ $l_Extn = $l_Extn[1]; }

				$l_Bgn = stStrUtil::cFind($l_SrcData, '/');
				$l_End = stStrUtil::cFind($l_SrcData, ';', $l_Bgn + 1);
				$l_Extn = stStrUtil::cSub($l_SrcData, $l_Bgn + 1, $l_End);
			}

			$l_CmaIdx = stStrUtil::cFind($l_SrcData, ',');
			$l_DcdData = stStrUtil::cSub($l_SrcData, $l_CmaIdx + 1);
			$l_FileData = base64_decode($l_DcdData);
			if (!$l_FileData)
			{ return null; }
		}
		else // $_Files
		{
			if (0 !== $l_SrcData['error'])
			{ return null; }

			if (!empty($a_Prms['c_FileExtn']))
			{
				$l_Extn = $a_Prms['c_FileExtn'];
			}
			else
			{
				$l_Extn = stStrUtil::cGetFileExtn($l_SrcData['name']);
			}
		}
		
		$l_Flnm = md5(uniqid(mt_rand(), true));
		if (\hpnWse\fBool($l_Extn))
		{
			$l_Flnm .= '.';
			$l_Flnm .= $l_Extn;
		}
		$l_Path = stStrUtil::cEnsrDiry($a_Prms['c_DstDiry']) . $l_Flnm;
		
		if ($l_IsBase64)
		{
			file_put_contents($l_Path, $l_FileData);
		}
		else
		{
			if (! move_uploaded_file($l_SrcData['tmp_name'], $l_Path))
			{ return null; }
		}

		return array('c_Flnm' => $l_Flnm);
	}
}

} // namespace hpnWse\nSpu

//////////////////////////////////// OVER ////////////////////////////////////